上次的線上討論因為大家的能力不太一樣,講一些東西時有人已經會了,有些人不會。
這樣會讓整個課堂變得很無趣,所以以後會改個方針
變成 : 開這周的題目 ==> 講要用的工具(基礎題) ==> 會的討論,不會的講一下工具用法與題示
大概講講下面會講甚麼:
0. 必先預備知識
因為前面的東西網路上已經一大堆,而且太簡單這裡就不講
各位可以先看一下
cin
cout
string
) 與 字元(char
)if
、for
、while
switch
)兩者都可以接收使用者輸入,但有一個不同:
當我今天宣告一個字串變數如果我要輸入hello cpp
使用cin
的話
cin>>s
cout<<s;
的到的結果
hello
會發現他只有把hello給存取而cpp則不會存入s
因為cin會因為讀到空格而結束,所以讀到hello時遇到空格,讀取結束,s存入hello
如果我們要讀整行怎麼辦呢?
這個時候,就要使用getline
:
getline
與cin
不同,cin
是遇到空格結束,而getline
是遇到'\n'(換行)才結束讀取
使用方法:
// getline (取得字串方式(輸入:cin) , 要存到的變數裡(s))
getline(cin,s);
cout<<s;
這樣我們就得到了:
hello cpp
當我們想要存取一行字在同一個變數裡時,就使用getline
吧!
個裡給一個情境:
當今天選舉時,我想知道這個候選人被投了幾票時,怎麼使用C++來計算呢?
有學過一點的可能會說可以用二階陣列,但如果我想要依照ASCII來排序候選人的名字時,用二階陣列就會有相形見絀的地方了
所以我們來介紹一個工具map
使用前,程式碼需要包含幾個東西
#include<map>
using namespace std;
map
顧名思義就是地圖 :我們需要一個住址與住址帶果們到的房子
也可以把他想成郵寄包裹
,會有包裹編號
與包裹裡面的內容物
需要注意幾點:
住址
去找到房子
包裹編號
去找到包裹裡面的內容物
然後我們就可以建立一個map
!
map<string,string> box
講解一下再<
>
裡的東西
用包裹編號
與內容物
來舉例的話:
< 包裹編號的類型(可以是int、string、char...) , 內容物的類型(可以是int、string、char...) > 變數名稱
用<
>
包起來,而變數名稱你可以想像他是物流公司(裡面有很多的包裹,每個包裹都有編號
與內容物
)
ok,現在我們已經建立一個map了,接下來就是在裡面建立包裹了!
// 變數名稱[編號] = 內容物
box["10001"] = "4090顯示卡";
box["940894"] = "用過的衛生紙";
如上所示:
我們建立了兩個包裹,編號分別為10001
與948794
而在10001
中我們會找到4090顯示卡
在948794
會找到用過的衛生紙
可以試試看:
cout<< box["10001"]<<endl;// 得到 4090
cout<< box["948794"]<<endl; //得到 用過的衛生紙
cout<< box["222"]<<endl; //未建立編號222 ==>沒東西
輸出結果:
4090顯示卡
用過的衛生紙
當然如你有需要,可以在製作更多的【包裹】XD
variable_name[key] = value ;
variable_name
就是變數名稱(在例子中就是指box)
我們說的包裹編號就是: key
而value
當然就是內容物拉
key
(注意:不會排value,value會跟著key一起排)map <string,int> the_bone;
the_bone["zzz"] = 5;
the_bone["azzzzzzzzzzz"] = 6;
the_bone["c"] = 9;
進入map後會被自動排序變成:(a<c<z)
the_bone["azzzzzzzzzzz"] = 6;
the_bone["c"] = 9;
the_bone["zzz"] = 5;
包裹
的型態必須跟建立的型態相同map<string,string> box //編號:字串 || 內容物:字串
box[1234] = "吉娃娃";//錯誤==>編號:整數 || 內容物:字串
box["23232"] = 大寶劍; //編號:字串 || 內容物:變數(未定義)<==錯誤(字串應該用""包起來)
Bbox["666"] = "刮腿毛,撿到男高中生"; // 錯誤==>未定義 Bbox
情境:
如果我今天要讓使用者自己輸入編號或包裹內容呢?
那我們可以這樣:
string s,s1;
cin>>s>>s1;
box[s] = s1;
cout<<box[s]<<endl;
這樣就建立拉!
試試輸入:
1234
九轉大腸
輸出結果
九轉大腸
新鮮的大腸就送到你家摟~XD
當然map
最主要的目的是用來計數的
假如說我們想看看一串話(hello cpp)每個子母出現幾次
建立一個map
map<char,int> eee;//編號:字元(英文字母) || 內容物:整數
接下來我們要讀取一串話(會有空格) ==>用getline
string s;
getline(cin,s);
然後用for
經過整個s並且存入map
for (int i = 0; i < s.length(); i++)//從s[0] 到 s[最後一個字]
{
if (s[i] != ' ')//如果不是空格就存入
eee[s[i]]++;
}
人體操做一次:
s[0] = 'h' ==> eee[s[0]]++ 也就是 eee['h'] = 1
s[1] = 'e' ==> eee[s[1]]++ 也就是 eee['e'] = 1
s[2] = 'l' ==> eee[s[2]]++ 也就是 eee['l'] = 1
s[3] = 'l' ==> eee[s[3]]++ 也就是 eee['l'] = 2
s[4] = 'o' ==> eee[s[4]]++ 也就是 eee['o'] = 1
s[5] = ' ' ==> 為空格 ==> 不存入
s[6] = 'c' ==> eee[s[4]]++ 也就是 eee['c'] = 1
s[7] = 'p' ==> eee[s[7]]++ 也就是 eee['p'] = 1
s[8] = 'p' ==> eee[s[8]]++ 也就是 eee['p'] = 2
經過程式可以得到:
//會自動排key
eee['c'] = 1;
eee['e'] = 1;
eee['h'] = 1;
eee['l'] = 2;
eee['o'] = 1;
eee['p'] = 2;
因為文章有長度限制,咱們在下篇繼續